{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "caf14a13",
   "metadata": {},
   "source": [
    "## Predicting exons with Evo 2 Embeddings\n",
    "\n",
    "As a result of extensive pretraining, we expect Evo 2 embeddings to capture details of eukaryotic gene architecture. By training a lightweight model on top of Evo 2 embeddings, we can build classifiers to predict genomic annotations. Annotation prediction tools, in combination with bioinformatic approaches, may aid in characterization of non-reference organism genomes. We demonstrate this approach by training a classifier to predict exonic annotation of a genomic position at single-nucleotide resolution. \n",
    "\n",
    "Here, we start by loading sample positions. We then extract Evo 2 embeddings for sample positions from diverse eukaryotes, run them through the exon classifier, and demonstrate classification accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "14edf7c0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>organism</th>\n",
       "      <th>assembly</th>\n",
       "      <th>gene_name</th>\n",
       "      <th>sequence_record</th>\n",
       "      <th>strand</th>\n",
       "      <th>position</th>\n",
       "      <th>label</th>\n",
       "      <th>forward_seq</th>\n",
       "      <th>reverse_seq</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Homo_sapiens</td>\n",
       "      <td>GCF_000001405.40</td>\n",
       "      <td>CLCN7</td>\n",
       "      <td>NC_000016.10</td>\n",
       "      <td>-</td>\n",
       "      <td>1453979.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>atcactttgcttgtgtcttaccaaagatctttgcatccgtggttgt...</td>\n",
       "      <td>ggaagacctgccttcccagccagtgtccacagggcagcaattccac...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Homo_sapiens</td>\n",
       "      <td>GCF_000001405.40</td>\n",
       "      <td>PRORP</td>\n",
       "      <td>NC_000014.9</td>\n",
       "      <td>+</td>\n",
       "      <td>35275559.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>gtcagagggttgtgaatggggtggtcaggaacagcctttctgaggg...</td>\n",
       "      <td>tacaaaaaataaattaaccaggtgtggtggtgtccaccttataggg...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Homo_sapiens</td>\n",
       "      <td>GCF_000001405.40</td>\n",
       "      <td>ZNF804B</td>\n",
       "      <td>NC_000007.14</td>\n",
       "      <td>+</td>\n",
       "      <td>88969116.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>ttccttctgaatccaccaatgattttgtcattgacaaataaccttg...</td>\n",
       "      <td>aaactattcaaaaaaaaaaatagaggatgaaggaatacttccaaac...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Homo_sapiens</td>\n",
       "      <td>GCF_000001405.40</td>\n",
       "      <td>VPS8</td>\n",
       "      <td>NC_000003.12</td>\n",
       "      <td>+</td>\n",
       "      <td>184850021.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>tcagccaagttcattgaggaatgctgaatcctgtataagtgtattt...</td>\n",
       "      <td>cagtcatccttataatttgcttcttccccttctgctccaaggtaac...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Homo_sapiens</td>\n",
       "      <td>GCF_000001405.40</td>\n",
       "      <td>GOLGB1</td>\n",
       "      <td>NC_000003.12</td>\n",
       "      <td>-</td>\n",
       "      <td>121729928.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>ttcattaaaagttaaccaaagaaaatatgatctctaaagttgaaaa...</td>\n",
       "      <td>gggaagaagaatgtcacatactggtgccatttaacataaaatcaca...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>117</th>\n",
       "      <td>Danio_rerio</td>\n",
       "      <td>GCF_000002035.6</td>\n",
       "      <td>map2</td>\n",
       "      <td>NC_007120.7</td>\n",
       "      <td>+</td>\n",
       "      <td>38833672.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>agacttgatagcatcagctctctgagtaattcataatgtgagatgt...</td>\n",
       "      <td>gcttataaatcactgaaagagtgcttactgttaattgaattatatt...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>118</th>\n",
       "      <td>Danio_rerio</td>\n",
       "      <td>GCF_000002035.6</td>\n",
       "      <td>sgce</td>\n",
       "      <td>NC_007130.7</td>\n",
       "      <td>-</td>\n",
       "      <td>41037095.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>agccatatcgcactgctaggagtgtgatattgcatttatacaacag...</td>\n",
       "      <td>ttaaagcattacaggtcaaagcaatccgttgttactgtacttgttt...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>119</th>\n",
       "      <td>Danio_rerio</td>\n",
       "      <td>GCF_000002035.6</td>\n",
       "      <td>porcnl</td>\n",
       "      <td>NC_007119.7</td>\n",
       "      <td>-</td>\n",
       "      <td>22544340.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>gctaaatgactctactatactaaactctactatatactcaaagaga...</td>\n",
       "      <td>gctttggatgtgtgttggggtgaggaccctacagacatcatgcaag...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>120</th>\n",
       "      <td>Danio_rerio</td>\n",
       "      <td>GCF_000002035.6</td>\n",
       "      <td>si:dkey-7j14.5</td>\n",
       "      <td>NC_007127.7</td>\n",
       "      <td>-</td>\n",
       "      <td>43023144.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>cttaaacatttattcaaatttatttttaaatattcagaaatgaagc...</td>\n",
       "      <td>atttctcaaattgtgattcgattgaacttgatagatgttgccctgt...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>121</th>\n",
       "      <td>Danio_rerio</td>\n",
       "      <td>GCF_000002035.6</td>\n",
       "      <td>pudp</td>\n",
       "      <td>NC_007112.7</td>\n",
       "      <td>+</td>\n",
       "      <td>32370467.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>cgcacctgcagtgtttagcacagaagaacagaataaactaaataaa...</td>\n",
       "      <td>tataactcaggtttttgaacacacttcgttaatattgttcatttat...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>122 rows × 9 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         organism          assembly       gene_name sequence_record strand  \\\n",
       "0    Homo_sapiens  GCF_000001405.40           CLCN7    NC_000016.10      -   \n",
       "1    Homo_sapiens  GCF_000001405.40           PRORP     NC_000014.9      +   \n",
       "2    Homo_sapiens  GCF_000001405.40         ZNF804B    NC_000007.14      +   \n",
       "3    Homo_sapiens  GCF_000001405.40            VPS8    NC_000003.12      +   \n",
       "4    Homo_sapiens  GCF_000001405.40          GOLGB1    NC_000003.12      -   \n",
       "..            ...               ...             ...             ...    ...   \n",
       "117   Danio_rerio   GCF_000002035.6            map2     NC_007120.7      +   \n",
       "118   Danio_rerio   GCF_000002035.6            sgce     NC_007130.7      -   \n",
       "119   Danio_rerio   GCF_000002035.6          porcnl     NC_007119.7      -   \n",
       "120   Danio_rerio   GCF_000002035.6  si:dkey-7j14.5     NC_007127.7      -   \n",
       "121   Danio_rerio   GCF_000002035.6            pudp     NC_007112.7      +   \n",
       "\n",
       "        position  label                                        forward_seq  \\\n",
       "0      1453979.0    0.0  atcactttgcttgtgtcttaccaaagatctttgcatccgtggttgt...   \n",
       "1     35275559.0    1.0  gtcagagggttgtgaatggggtggtcaggaacagcctttctgaggg...   \n",
       "2     88969116.0    0.0  ttccttctgaatccaccaatgattttgtcattgacaaataaccttg...   \n",
       "3    184850021.0    1.0  tcagccaagttcattgaggaatgctgaatcctgtataagtgtattt...   \n",
       "4    121729928.0    1.0  ttcattaaaagttaaccaaagaaaatatgatctctaaagttgaaaa...   \n",
       "..           ...    ...                                                ...   \n",
       "117   38833672.0    0.0  agacttgatagcatcagctctctgagtaattcataatgtgagatgt...   \n",
       "118   41037095.0    1.0  agccatatcgcactgctaggagtgtgatattgcatttatacaacag...   \n",
       "119   22544340.0    1.0  gctaaatgactctactatactaaactctactatatactcaaagaga...   \n",
       "120   43023144.0    1.0  cttaaacatttattcaaatttatttttaaatattcagaaatgaagc...   \n",
       "121   32370467.0    0.0  cgcacctgcagtgtttagcacagaagaacagaataaactaaataaa...   \n",
       "\n",
       "                                           reverse_seq  \n",
       "0    ggaagacctgccttcccagccagtgtccacagggcagcaattccac...  \n",
       "1    tacaaaaaataaattaaccaggtgtggtggtgtccaccttataggg...  \n",
       "2    aaactattcaaaaaaaaaaatagaggatgaaggaatacttccaaac...  \n",
       "3    cagtcatccttataatttgcttcttccccttctgctccaaggtaac...  \n",
       "4    gggaagaagaatgtcacatactggtgccatttaacataaaatcaca...  \n",
       "..                                                 ...  \n",
       "117  gcttataaatcactgaaagagtgcttactgttaattgaattatatt...  \n",
       "118  ttaaagcattacaggtcaaagcaatccgttgttactgtacttgttt...  \n",
       "119  gctttggatgtgtgttggggtgaggaccctacagacatcatgcaag...  \n",
       "120  atttctcaaattgtgattcgattgaacttgatagatgttgccctgt...  \n",
       "121  tataactcaggtttttgaacacacttcgttaatattgttcatttat...  \n",
       "\n",
       "[122 rows x 9 columns]"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "positions = pd.read_csv('notebooks/exon_classifier/samplePositions.tsv',sep='\\t')\n",
    "positions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "eff8873f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">[06/10/25 11:34:05] </span><span style=\"color: #808000; text-decoration-color: #808000\">WARNING </span> root - WARNING - Supported flash-attn versions are &gt;= <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2.1</span>.<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, &lt;=       <a href=\"file:///home/jon/projects/evo2/envs/public_evo2/lib/python3.11/site-packages/transformer_engine/pytorch/attention.py\" target=\"_blank\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">attention.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:</span><a href=\"file:///home/jon/projects/evo2/envs/public_evo2/lib/python3.11/site-packages/transformer_engine/pytorch/attention.py#164\" target=\"_blank\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">164</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">                    </span>         <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2.6</span>.<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3</span>. Found flash-attn <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2.7</span>.<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4.</span>post1.                                  <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">                </span>\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m[06/10/25 11:34:05]\u001b[0m\u001b[2;36m \u001b[0m\u001b[33mWARNING \u001b[0m root - WARNING - Supported flash-attn versions are >= \u001b[1;36m2.1\u001b[0m.\u001b[1;36m1\u001b[0m, <=       \u001b]8;id=923673;file:///home/jon/projects/evo2/envs/public_evo2/lib/python3.11/site-packages/transformer_engine/pytorch/attention.py\u001b\\\u001b[2mattention.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=226087;file:///home/jon/projects/evo2/envs/public_evo2/lib/python3.11/site-packages/transformer_engine/pytorch/attention.py#164\u001b\\\u001b[2m164\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m                    \u001b[0m         \u001b[1;36m2.6\u001b[0m.\u001b[1;36m3\u001b[0m. Found flash-attn \u001b[1;36m2.7\u001b[0m.\u001b[1;36m4.\u001b[0mpost1.                                  \u001b[2m                \u001b[0m\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0d02f4957c33495dba1f023d57ccff77",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Fetching 4 files:   0%|          | 0/4 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found complete file in repo: evo2_7b_base.pt\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 32/32 [00:00<00:00, 243.12it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extra keys in state_dict: {'blocks.3.mixer.dense._extra_state', 'unembed.weight', 'blocks.31.mixer.dense._extra_state', 'blocks.24.mixer.dense._extra_state', 'blocks.10.mixer.dense._extra_state', 'blocks.17.mixer.dense._extra_state'}\n"
     ]
    }
   ],
   "source": [
    "# Load Evo2 model\n",
    "from evo2 import Evo2\n",
    "\n",
    "evo2_model = Evo2('evo2_7b_base')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a7c3860f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Function to tokenize and get embedding for the final token in a sequence\n",
    "import torch\n",
    "\n",
    "def get_final_token_embedding(sequence, model, layer_name):\n",
    "    input_ids = torch.tensor(\n",
    "        model.tokenizer.tokenize(sequence),\n",
    "        dtype=torch.int,\n",
    "    ).unsqueeze(0).to('cuda:0')\n",
    "    with torch.no_grad():\n",
    "        _, embeddings = model(input_ids, return_embeddings=True, layer_names=[layer_name])\n",
    "    return embeddings[layer_name][0, -1, :].cpu().to(torch.float32).numpy()  # shape: (hidden_dim,)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "0a2119c2",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Extracting embeddings: 100%|██████████| 122/122 [01:24<00:00,  1.44it/s]\n"
     ]
    }
   ],
   "source": [
    "# Get Evo 2 embeddings for the each position and append to the dataframe\n",
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "\n",
    "embedding_list = []\n",
    "layer_name = 'blocks.26'\n",
    "\n",
    "for _, row in tqdm(positions.iterrows(), total=len(positions), desc=\"Extracting embeddings\"):\n",
    "    emb_fwd = get_final_token_embedding(row['forward_seq'], evo2_model, layer_name)\n",
    "    emb_rev = get_final_token_embedding(row['reverse_seq'], evo2_model, layer_name)\n",
    "    emb_concat = np.concatenate((emb_fwd, emb_rev))\n",
    "    embedding_list.append(emb_concat)\n",
    "\n",
    "# Add to DataFrame\n",
    "positions['embedding'] = embedding_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "75897185",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the lightweight exon classifier\n",
    "from transformers import AutoModel\n",
    "\n",
    "exon_classifier = AutoModel.from_pretrained(\n",
    "    \"schmojo/evo2-exon-classifier\",\n",
    "    trust_remote_code=True   # pulls the two .py files\n",
    ").to('cuda:0')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "6e75e257",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Calculating exonic probabilities: 100%|██████████| 122/122 [00:00<00:00, 1199.94it/s]\n"
     ]
    }
   ],
   "source": [
    "# Generate exonic probabilities for each sample position\n",
    "exonic_probs_list = []\n",
    "\n",
    "for _, row in tqdm(positions.iterrows(), total=len(positions), desc=\"Calculating exonic probabilities\"):\n",
    "    embedding_tensor = torch.tensor(row['embedding'], dtype=torch.float32).unsqueeze(0).unsqueeze(1).to('cuda:0')\n",
    "    prob = exon_classifier(embedding_tensor)\n",
    "    prob_value = prob['logits'].item()\n",
    "    exonic_probs_list.append(prob_value)\n",
    "\n",
    "# Add to DataFrame\n",
    "positions['exon_prob'] = exonic_probs_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d0c50668",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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AACVSoWPP/4Yly9fxldffZVrm/j4eEyePBlubm4YMWIEAECpVOKTTz7BlStXMHv2bKOPFR8fn+v9nVNrXie8knHswSADTk5OmDx5MiZOnIjVq1dj0KBB+PHHHxESEoKOHTti6NChqFixIpKSknD58mWcPn0a69atAwDMmjUL27dvR8uWLfHpp5+idu3aSE5Oxp9//okJEyYgICAA48aNw4YNG9CyZUuMHz8ederUgU6nw507d7Bz5058+OGHaNSo0QtrfOuttzBy5Eg8ePAATZs2zfWBO2vWLERHR6Np06YYO3YsqlevjszMTNy6dQvbtm3DkiVLCtx9vXLlSrRv3x7BwcEYO3Ys2rVrB+DpsfkFCxYgICDA6Aeui4sL2rZti//85z/6USRXrlwx+OKVou6uXbsiKioKo0ePRp8+fXD37l3Mnj0bHh4euWZorV27Nvbt24fff/8dHh4esLe3f+Uvr7CwMHz77bcYNGgQPvvsM/j5+WH79u3YsWMHALz0L11fX19971S9evXw3nvvoX79+gCAS5cuYdmyZRBCoGfPnibVZUq75KVLly6YN28eBgwYgHfeeQeJiYn4+uuv9V/KOSpXroxPP/0Us2fPxpMnT9C/f384Ojri0qVLSEhIwMyZMwE8bf+oqCgsXrwYgYGBMDMzQ1BQEPr164eIiAh07twZH3zwARo2bAilUol79+5h79696NGjh8nPH3g6oqJWrVoICgqCq6srbt++jfnz58PHx0c/cqp27doAgAULFiAsLAxKpRLVq1fP1WsCPD2vZvny5Rg1ahSuXr2KNm3aQKfT4a+//kKNGjXQr1+/PGtp3bo1li1bhn/++Sdf548olUrMmTMHffv2xYIFCzB16lQAwCeffIK///5b/29oaCgcHR1x7tw5fPXVV0hLS8Mff/wBR0dH/b5yQsn06dNx/PhxDBgwAN7e3khJScGBAwfw008/YebMmWjWrJl+m2PHjqF8+fL69qF8kvUUU5JNXvNgCPF0zoBKlSqJatWqCY1GI4QQ4u+//xZ9+/YVFSpUEEqlUri7u4u2bdvmOhv77t274q233hLu7u76OS769u0r/v33X/066enpYurUqfox/jnj8cePH28w0uL5s+BzpKSkCGtr6xeewf7w4UMxduxY4evrK5RKpXB2dhaBgYFiypQp+vk2ckZjfPXVVya1XXp6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h0h2PD5PVHiken8xYBRTQgj9L9nKygrDhg1jlyEREZUY/MYqhoQQ2LZtm360CACGCyIiKlHYg1HM5ISLkydPAgD8/PxQoUIFmasiIiIyDf8sLkaEENi6das+XPTo0YPhgqgUOXLkCMzNzdGpU6dc9+3btw8KhQLJycm57qtXrx5mzJihv125cmUoFAooFApYW1sjICAAX331FYQQubZdsWIFGjZsCFtbW9jb26Nly5b4448/cq0nhMBPP/2ERo0awc7ODuXKlUNQUBDmz5+PjIyMV3reL/Lo0SMMHjwYjo6OcHJywsiRI422wbP+/fdfDB06VD+aqFOnTrh27ZrRdYUQCAkJgUKhwKZNm/J8bEdHRwwePNjoY4eHh6NOnTqwsrKCu7s73nvvvQI+27KFAaOYEELgjz/+wKlTpwAAb7zxBurVqydvUUQkqWXLluH999/HoUOHcOfOnVfa16xZsxAbG4vLly/jo48+wqeffoqffvrJYJ2PPvoII0eORN++ffH333/j+PHjaNGiBXr06IHvv//eYN3Bgwdj3Lhx6NGjB/bu3YuzZ8/iP//5DzZv3oydO3e+Uq0vMmDAAJw9exZ//vkntm3bhvPnz2PIkCF5ri+EwBtvvIGbN29i8+bNOHPmDHx8fNC+fXs8fvw41/rz58/P86TFZx/7zz//xNmzZzF48GCDdebNm4cpU6Zg0qRJuHjxInbv3o2OHTu+2pMuK0QZk5KSIgCIlJQUyfb5OEstfD75Q/h88odITs8weXudTic2b94sZsyYIWbMmCHOnj0rWW0lVXZ2tti0aZPIzs6Wu5RSozS06ZMnT8SlS5fEkydP5C5FaLVa8ejRI6HVavO1fnp6urC3txdXrlwRoaGhYubMmQb37927VwAQjx49yrVt3bp1xfTp0/W3fXx8xLfffmuwToMGDUSvXr30t48ePSoAiIULF+ba34QJE4RSqRR37twRQggRGRkpAIhNmzblWlen04nk5OR8PUdTXbp0SQAQx44dE0I8bdOdO3cKAOLKlStGt7l69aoAIC5cuKBfptFohLOzs/j5558N1j179qzw8vISsbGxAoDYuHFjno8txP/aLOexk5KShLW1tdi1a5dUT7lImfoazfGi95kp36HswSgGbty4gTNnzkChUKBnz56oW7eu3CURkcQiIyNRvXp1VK9eHYMGDcLy5cuN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",
      "text/plain": [
       "<Figure size 600x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot ROC and display Accuracy (threshold=0.5) and AUROC\n",
    "from sklearn.metrics import roc_auc_score, roc_curve, accuracy_score\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "y_true = positions['label']\n",
    "y_scores = positions['exon_prob']\n",
    "\n",
    "# AUROC\n",
    "auroc = roc_auc_score(y_true, y_scores)\n",
    "\n",
    "# Accuracy at threshold 0.5\n",
    "y_pred = (y_scores >= 0.5).astype(int)\n",
    "accuracy = accuracy_score(y_true, y_pred)\n",
    "\n",
    "# ROC curve\n",
    "fpr, tpr, _ = roc_curve(y_true, y_scores)\n",
    "\n",
    "# Plot\n",
    "plt.figure(figsize=(6, 6))\n",
    "plt.plot(fpr, tpr, label=f\"AUROC = {auroc:.4f}\\nAccuracy@0.5 = {accuracy:.4f}\")\n",
    "plt.plot([0, 1], [0, 1], linestyle='--', color='gray')  # Diagonal line\n",
    "plt.xlabel(\"False Positive Rate\")\n",
    "plt.ylabel(\"True Positive Rate\")\n",
    "plt.title(\"Receiver Operating Characteristic (ROC)\")\n",
    "plt.legend(loc='lower right')\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
